[IA64] acpi read-only mapping
authorawilliam@xenbuild.aw <awilliam@xenbuild.aw>
Wed, 24 May 2006 17:04:33 +0000 (11:04 -0600)
committerawilliam@xenbuild.aw <awilliam@xenbuild.aw>
Wed, 24 May 2006 17:04:33 +0000 (11:04 -0600)
implemented dom0 acpi read-only mapping

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
xen/arch/ia64/xen/dom_fw.c
xen/arch/ia64/xen/domain.c
xen/include/asm-ia64/domain.h

index 9d6694c35094998c6dbf820f785cd608d44b1c0a..b9941a253cea86f7fb1c75250c95437923140dd9 100644 (file)
@@ -697,6 +697,7 @@ dom_fw_fake_acpi(struct domain *d, struct fake_acpi_tables *tables)
 struct dom0_passthrough_arg {
 #ifdef CONFIG_XEN_IA64_DOM0_VP
     struct domain*      d;
+    int                 flags;
 #endif
     efi_memory_desc_t *md;
     int*                i;
@@ -711,7 +712,7 @@ dom_fw_dom0_passthrough(efi_memory_desc_t *md, void *arg__)
 #ifdef CONFIG_XEN_IA64_DOM0_VP
     struct domain* d = arg->d;
     u64 start = md->phys_addr;
-    u64 end = start + (md->num_pages << EFI_PAGE_SHIFT);
+    u64 size = md->num_pages << EFI_PAGE_SHIFT;
 
     if (md->type == EFI_MEMORY_MAPPED_IO ||
         md->type == EFI_MEMORY_MAPPED_IO_PORT_SPACE) {
@@ -720,13 +721,12 @@ dom_fw_dom0_passthrough(efi_memory_desc_t *md, void *arg__)
         //    It requires impractical memory to map such a huge region
         //    to a domain.
         //    For now we don't map it, but later we must fix this.
-        if (md->type == EFI_MEMORY_MAPPED_IO &&
-            ((md->num_pages << EFI_PAGE_SHIFT) > 0x100000000UL))
+        if (md->type == EFI_MEMORY_MAPPED_IO && (size > 0x100000000UL))
             return 0;
 
-        paddr = assign_domain_mmio_page(d, start, end - start);
+        paddr = assign_domain_mmio_page(d, start, size);
     } else
-        paddr = assign_domain_mach_page(d, start, end - start);
+        paddr = assign_domain_mach_page(d, start, size, arg->flags);
 #else
     paddr = md->phys_addr;
 #endif
@@ -874,9 +874,10 @@ dom_fw_init (struct domain *d, const char *args, int arglen, char *fw_mem, int f
        }
        if (d == dom0) {
 #ifdef CONFIG_XEN_IA64_DOM0_VP
-# define ASSIGN_DOMAIN_MACH_PAGE(d, p) assign_domain_mach_page(d, p, PAGE_SIZE)
+# define ASSIGN_DOMAIN_MACH_PAGE(d, p) \
+        assign_domain_mach_page((d), (p), PAGE_SIZE, ASSIGN_readonly)
 #else
-# define ASSIGN_DOMAIN_MACH_PAGE(d, p) ({p;})
+# define ASSIGN_DOMAIN_MACH_PAGE(d, p) (p)
 #endif
 
                printf("Domain0 EFI passthrough:");
@@ -990,17 +991,24 @@ dom_fw_init (struct domain *d, const char *args, int arglen, char *fw_mem, int f
                /* pass through the I/O port space */
                if (!running_on_sim) {
                        struct dom0_passthrough_arg arg;
+                       arg.md = &efi_memmap[i];
+                       arg.i = &i;
 #ifdef CONFIG_XEN_IA64_DOM0_VP
                        arg.d = d;
+                       arg.flags = ASSIGN_writable;
 #endif
-                       arg.md = &efi_memmap[i];
-                       arg.i = &i;
                        //XXX Is this needed?
                        efi_memmap_walk_type(EFI_RUNTIME_SERVICES_CODE,
                                             dom_fw_dom0_passthrough, &arg);
                        // for ACPI table.
+#ifdef CONFIG_XEN_IA64_DOM0_VP
+                       arg.flags = ASSIGN_readonly;
+#endif
                        efi_memmap_walk_type(EFI_RUNTIME_SERVICES_DATA,
                                             dom_fw_dom0_passthrough, &arg);
+#ifdef CONFIG_XEN_IA64_DOM0_VP
+                       arg.flags = ASSIGN_writable;
+#endif
                        efi_memmap_walk_type(EFI_ACPI_RECLAIM_MEMORY,
                                             dom_fw_dom0_passthrough, &arg);
                        efi_memmap_walk_type(EFI_MEMORY_MAPPED_IO,
index 16af32d18668079da2e9e70d97dfb6f8d28ab0d8..089c9c77b7e0774ad7aa6955bc88549b533d5307 100644 (file)
@@ -873,12 +873,13 @@ assign_domain_page(struct domain *d,
 #ifdef CONFIG_XEN_IA64_DOM0_VP
 static void
 assign_domain_same_page(struct domain *d,
-                        unsigned long mpaddr, unsigned long size)
+                        unsigned long mpaddr, unsigned long size,
+                        unsigned long flags)
 {
     //XXX optimization
     unsigned long end = mpaddr + size;
     for (; mpaddr < end; mpaddr += PAGE_SIZE) {
-        __assign_domain_page(d, mpaddr, mpaddr, ASSIGN_writable);
+        __assign_domain_page(d, mpaddr, mpaddr, flags);
     }
 }
 
@@ -945,15 +946,16 @@ assign_domain_mmio_page(struct domain *d,
                 __func__, __LINE__, d, mpaddr, size);
         return -EINVAL;
     }
-    assign_domain_same_page(d, mpaddr, size);
+    assign_domain_same_page(d, mpaddr, size, ASSIGN_writable);
     return mpaddr;
 }
 
 unsigned long
 assign_domain_mach_page(struct domain *d,
-                        unsigned long mpaddr, unsigned long size)
+                        unsigned long mpaddr, unsigned long size,
+                        unsigned long flags)
 {
-    assign_domain_same_page(d, mpaddr, size);
+    assign_domain_same_page(d, mpaddr, size, flags);
     return mpaddr;
 }
 
index 679de155ad33c174039b5b45f0562d055a981225..466bcaf7e6d54de7c6852a26c2ee7c2db4bf1e68 100644 (file)
@@ -120,7 +120,7 @@ void assign_domain_io_page(struct domain *d, unsigned long mpaddr, unsigned long
 #ifdef CONFIG_XEN_IA64_DOM0_VP
 void alloc_dom_xen_and_dom_io(void);
 unsigned long assign_domain_mmio_page(struct domain *d, unsigned long mpaddr, unsigned long size);
-unsigned long assign_domain_mach_page(struct domain *d, unsigned long mpaddr, unsigned long size);
+unsigned long assign_domain_mach_page(struct domain *d, unsigned long mpaddr, unsigned long size, unsigned long flags);
 unsigned long do_dom0vp_op(unsigned long cmd, unsigned long arg0, unsigned long arg1, unsigned long arg2, unsigned long arg3);
 unsigned long dom0vp_zap_physmap(struct domain *d, unsigned long gpfn, unsigned int extent_order);
 unsigned long dom0vp_add_physmap(struct domain* d, unsigned long gpfn, unsigned long mfn, unsigned long flags, domid_t domid);